package cn.itsource.pethome.web.controller;

import cn.itsource.pethome.domain.Department;
import cn.itsource.pethome.query.DepartmentQuery;
import cn.itsource.pethome.service.IDepartmentService;
import cn.itsource.pethome.utils.AjaxResult;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 由于此项目是前后端分离项目，所有controller的所有方法上面都必须是@ResponseBody（异步处理）
 * 那么就可以将此注解添加到类上面，表示当前类的所有方法都是异步处理！
 * 那么SpringMVC中提供了一个@RestController，就是@Controller和@ResponseBody的合体!
 * @RestController 既表示@Controller，也表示@ResponseBody，而且还支持Restful风格的请求！
 *
 * @CrossOrigin 是SpringMVC的注解，表示支持跨域访问
 *  但是每一个Controller都需要添加这个注解
 *  解决：
 *      1）可以写一个Controller的父类，把这个注解添加到父类中
 *      2）可以自定义一个注解@RestAndCross，将@RestController和@CrossOrigin二合一
 *      3）写一个全局过滤器
 */
@RestController
//@CrossOrigin
public class DepartmentController {

    @Autowired
    private IDepartmentService departmentService;

    /**
     * 分页查询部门列表
     * Restful风格：各个方法上面的注解的地址都一样，但是请求方式不一样，就可以表达不同操作！
     * @GetMapping("/department")       获取：查询
     * @DeleteMapping("/department")    删除
     * @PostMapping("/department")      修改
     * @PutMapping("/department")       新增
     * @PatchMapping("/department")     分页查询
     *
     * @RequestBody 顾名思义：从请求的消息体中获取数据
     * 在前后端分离项目中尤其常见，前端发送请求的参数有时候是json对象，json对象会被封装到请求的消息体中，是一堆
     * json字符串；
     * 前后端未分离项目中虽然前端传递仍然是一个json对象，但实际上在发送请求的时候会被x-www-form-urlencoded编码；
     * 而前后端分离项目中传递一个json对象则不会被编码，就是以json字符串进行传递，所以后端必须使用json工具包来讲
     * json字符串转化为我们需要的实体类对象！
     * 而@RequestBody的作用，就是告诉SpringMVC：请它从请求的消息体中获取json字符串，然后底层使用jackson工具包转化
     * 为实体类对象！
     * ObjectMapper objectMapper = new ObjectMapper();
     * 实体类 变量 = objectMapper.readValue("json字符串", 实体类字节码对象);
     * String jsonStr = objectMapper.writeValueAsString(对象);
     * @param departmentQuery
     * @return
     */
    @PatchMapping("/department")
    public PageInfo<Department> findPage(@RequestBody DepartmentQuery departmentQuery) {
        ObjectMapper objectMapper = new ObjectMapper();
        return departmentService.findPage(departmentQuery);
    }

    /**
     * 新增和修改
     * @param department
     * @return
     */
    @PutMapping("/department")
    public AjaxResult save(@RequestBody Department department){
        try {
            departmentService.save(department);
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMsg("操作失败！" + e.getMessage());
        }
    }

    /**
     * 删除部门
     * @param id
     * @return
     */
    @DeleteMapping("/department/{id}")
    public AjaxResult delete(@PathVariable("id") Long id){
        try {
            departmentService.delete(id);
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMsg("操作失败！" + e.getMessage());
        }
    }
    /**
     * 批量删除部门
     * @param ids
     * @return
     */
    @DeleteMapping("/department/batchRemove/{ids}")
    public AjaxResult batchRemove(@PathVariable("ids") List<Long> ids){
        try {
            System.out.println(ids);
            departmentService.batchRemove(ids);
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setSuccess(false).setMsg("操作失败！" + e.getMessage());
        }
    }

    /**
     * 查询部门
     * @param findParent 1表示查询父级部门  2表示查询子部门
     * @return
     */
    @GetMapping("/department/findAllParent/{findParent}")
    public List<Department> findAllParent(@PathVariable("findParent")Integer findParent){
        return departmentService.findAllParent(findParent);
    }

    /**
     * 通过部门名称查询部门
     * @param name
     * @param id 新增时id为null，修改时id不为null
     * @return
     */
    @GetMapping("/department/findByName/{name}/{id}")
    public Department findByName(@PathVariable("name")String name, @PathVariable("id")String id){
        Long idLong = StringUtils.isNotBlank(id) && !"null".equals(id) ? Long.valueOf(id) : null;
        return departmentService.findByName(name, idLong);
    }

}
